/**
 * @author Roger Wu reference:dwz.drag.js, dwz.dialogDrag.js, dwz.resize.js,
 *         dwz.taskBar.js
 */
(function($) {
	$.pdialog = {
		_op : {
			//高度
			height : 300,
			//宽度
			width : 580,
			//最小高度
			minH : 40,
			//最小宽度
			minW : 50,
			//总数
			total : 20,
			max : false,
			mask : false,
			resizable : true,
			drawable : true,
			maxable : true,
			minable : true,
			fresh : true,
			//关闭时的回调函数
			closeCallBack:function(){}
		},
		_current : null,
		_zIndex : 42,
		getCurrent : function() {
			return this._current;
		},
		reload : function(url, options) {
			var op = $.extend({
						data : {},
						dialogId : "",
						callback : null
					}, options);
			var dialog = (op.dialogId && $("body").data(op.dialogId))
					|| this._current;
			if (dialog) {
				var jDContent = dialog.find(".dialogContent");
				jDContent.ajaxUrl({
					type : "POST",
					url : url,
					data : op.data,
					callback : function(response) {
						jDContent.find("[layoutH]").layoutH(jDContent);
						$(".pageContent", dialog).width($(dialog).width() - 14);
						$(":button.close", dialog).click(function() {
									$.pdialog.close(dialog);
									return false;
								});
						if ($.isFunction(op.callback))
							op.callback(response,dialog);
					}
				});
			}
		},
		// 打开一个层
		open : function(url, dlgid, title, options,callback,params) {
			var p = $.extend({},params);

			var op = $.extend({}, $.pdialog._op, options);
			_op = op;
			if("_blank" === dlgid) {
				dlgid = Math.round(Math.random() * 10000000)+"";
			}
			var dialog = $("body").data(dlgid);
			// 重复打开一个层
			if (dialog) {
				if (dialog.is(":hidden")) {
					dialog.show();
				}
				if (op.fresh || url != $(dialog).data("url")) {
					dialog.data("url", url);
					dialog.find(".dialogHeader").find("h1").html(title);
					this.switchDialog(dialog);
					var jDContent = dialog.find(".dialogContent");
					jDContent.loadUrl(url, p, function() {
						jDContent.find("[layoutH]").layoutH(jDContent);
						$(".pageContent", dialog).width($(dialog).width() - 14);
						$("button.close").click(function() {
									$.pdialog.close(dialog);
									return false;
						});

					});
				}

			} else { // 打开一个全新的层

				$("body").append(DWZ.frag["dialogFrag"]);
				dialog = $(">.dialog:last-child", "body");
				dialog.data("id", dlgid);
				dialog.data("url", url);
				if (options.close)
					dialog.data("close", options.close);
				if (options.param)
					dialog.data("param", options.param);
				($.fn.bgiframe && dialog.bgiframe());

				dialog.find(".dialogHeader").find("h1").html(title);
				$(dialog).css("zIndex", ($.pdialog._zIndex += 2));
				$("div.shadow").css("zIndex", $.pdialog._zIndex - 3).show();
				$.pdialog._init(dialog, options);
				$(dialog).click(function() {
							$.pdialog.switchDialog(dialog);
						});

				if (op.resizable)
					dialog.jresize();
				if (op.drawable)
					dialog.dialogDrag();
				$("a.close", dialog).click(function(event) {
							$.pdialog.close(dialog);
							return false;
						});
				if (op.maxable) {
					$("a.maximize", dialog).show().click(function(event) {
								$.pdialog.switchDialog(dialog);
								$.pdialog.maxsize(dialog);
								dialog.jresize("destroy").dialogDrag("destroy");
								return false;
							});
				} else {
					$("a.maximize", dialog).hide();
				}
				$("a.restore", dialog).click(function(event) {
							$.pdialog.restore(dialog);
							dialog.jresize().dialogDrag();
							return false;
						});
				if (op.minable) {
					$("a.minimize", dialog).show().click(function(event) {
								$.pdialog.minimize(dialog);
								return false;
							});
				} else {
					$("a.minimize", dialog).hide();
				}
				$("div.dialogHeader a", dialog).mousedown(function() {
							return false;
						});
				$("div.dialogHeader", dialog).dblclick(function() {
							if ($("a.restore", dialog).is(":hidden"))
								$("a.maximize", dialog).trigger("click");
							else
								$("a.restore", dialog).trigger("click");
						});
				if (op.max) {
					// $.pdialog.switchDialog(dialog);
					$.pdialog.maxsize(dialog);
					dialog.jresize("destroy").dialogDrag("destroy");
				}
				$("body").data(dlgid, dialog);
				$.pdialog._current = dialog;
				$.pdialog.attachShadow(dialog);
				// load data
				var jDContent = $(".dialogContent", dialog);
				jDContent.loadUrl(url, p, function() {
							var test = jDContent.find("[layoutH]");
							test.layoutH(jDContent);
							$(".pageContent", dialog).width($(dialog).width()
									- 14);
							$("button.close").click(function() {
										$.pdialog.close(dialog);
										return false;
							});
						if(typeof callback == "function") {
							callback.call(this,dialog);
						}
				});
			}
			if (op.mask) {
				$(dialog).css("zIndex", 1000);
				$("a.minimize", dialog).hide();
				$(dialog).data("mask", true);
				$("#dialogBackground").show();
			} else {
				// add a task to task bar
				if (op.minable)
					$.taskBar.addDialog(dlgid, title);
			}
		},
		/**
		 * 切换当前层
		 * 
		 * @param {Object}
		 *            dialog
		 */
		switchDialog : function(dialog) {
			var index = $(dialog).css("zIndex");
			$.pdialog.attachShadow(dialog);
			if ($.pdialog._current) {
				var cindex = $($.pdialog._current).css("zIndex");
				$($.pdialog._current).css("zIndex", index);
				$(dialog).css("zIndex", cindex);
				$("div.shadow").css("zIndex", cindex - 1);
				$.pdialog._current = dialog;
			}
			$.taskBar.switchTask(dialog.data("id"));
		},
		/**
		 * 给当前层附上阴隐层
		 * 
		 * @param {Object}
		 *            dialog
		 */
		attachShadow : function(dialog) {
			var shadow = $("div.shadow");
			if (shadow.is(":hidden"))
				shadow.show();
			shadow.css({
						top : parseInt($(dialog)[0].style.top) - 2,
						left : parseInt($(dialog)[0].style.left) - 4,
						height : parseInt($(dialog).height()) + 8,
						width : parseInt($(dialog).width()) + 8,
						zIndex : parseInt($(dialog).css("zIndex")) - 1
					});
			$(".shadow_c", shadow).children().andSelf().each(function() {
						$(this).css("height", $(dialog).outerHeight() - 4);
					});
		},
		_init : function(dialog, options) {
			var op = $.extend({}, this._op, options);
			var height = op.height > op.minH ? op.height : op.minH;
			var width = op.width > op.minW ? op.width : op.minW;
			if (isNaN(dialog.height()) || dialog.height() < height) {
				$(dialog).height(height + "px");
				$(".dialogContent", dialog).height(height
						- $(".dialogHeader", dialog).outerHeight()
						- $(".dialogFooter", dialog).outerHeight() - 6);
			}
			if (isNaN(dialog.css("width")) || dialog.width() < width) {
				$(dialog).width(width + "px");
			}

			var iTop = ($(window).height() - dialog.height()) / 2;
			dialog.css({
						left : ($(window).width() - dialog.width()) / 2,
						top : iTop > 0 ? iTop : 0
					});
		},
		/**
		 * 初始化半透明层
		 * 
		 * @param {Object}
		 *            resizable
		 * @param {Object}
		 *            dialog
		 * @param {Object}
		 *            target
		 */
		initResize : function(resizable, dialog, target) {
			$("body").css("cursor", target + "-resize");
			resizable.css({
						top : $(dialog).css("top"),
						left : $(dialog).css("left"),
						height : $(dialog).css("height"),
						width : $(dialog).css("width")
					});
			resizable.show();
		},
		/**
		 * 改变阴隐层
		 * 
		 * @param {Object}
		 *            target
		 * @param {Object}
		 *            options
		 */
		repaint : function(target, options) {
			var shadow = $("div.shadow");
			if (target != "w" && target != "e") {
				shadow.css("height", shadow.outerHeight() + options.tmove);
				$(".shadow_c", shadow).children().andSelf().each(function() {
					$(this)
							.css("height",
									$(this).outerHeight() + options.tmove);
				});
			}
			if (target == "n" || target == "nw" || target == "ne") {
				shadow.css("top", options.otop - 2);
			}
			if (options.owidth && (target != "n" || target != "s")) {
				shadow.css("width", options.owidth + 8);
			}
			if (target.indexOf("w") >= 0) {
				shadow.css("left", options.oleft - 4);
			}
		},
		/**
		 * 改变左右拖动层的高度
		 * 
		 * @param {Object}
		 *            target
		 * @param {Object}
		 *            tmove
		 * @param {Object}
		 *            dialog
		 */
		resizeTool : function(target, tmove, dialog) {
			$("div[class^='resizable']", dialog).filter(function() {
				return $(this).attr("tar") == 'w' || $(this).attr("tar") == 'e';
			}).each(function() {
						$(this).css("height", $(this).outerHeight() + tmove);
					});
		},
		/**
		 * 改变原始层的大小
		 * 
		 * @param {Object}
		 *            obj
		 * @param {Object}
		 *            dialog
		 * @param {Object}
		 *            target
		 */
		resizeDialog : function(obj, dialog, target) {
			var oleft = parseInt(obj.style.left);
			var otop = parseInt(obj.style.top);
			var height = parseInt(obj.style.height);
			var width = parseInt(obj.style.width);
			if (target == "n" || target == "nw") {
				tmove = parseInt($(dialog).css("top")) - otop;
			} else {
				tmove = height - parseInt($(dialog).css("height"));
			}
			$(dialog).css({
						left : oleft,
						width : width,
						top : otop,
						height : height
					});
			$(".dialogContent", dialog).css("width", (width - 12) + "px");
			$(".pageContent", dialog).css("width", (width - 14) + "px");
			if (target != "w" && target != "e") {
				var content = $(".dialogContent", dialog);
				content.css({
							height : height
									- $(".dialogHeader", dialog).outerHeight()
									- $(".dialogFooter", dialog).outerHeight()
									- 6
						});
				content.find("[layoutH]").layoutH(content);
				$.pdialog.resizeTool(target, tmove, dialog);
			}
			$.pdialog.repaint(target, {
						oleft : oleft,
						otop : otop,
						tmove : tmove,
						owidth : width
					});

			$(window).trigger(DWZ.eventType.resizeGrid);
		},
		close : function(dialog) {
			
			if (typeof dialog == 'string') {
				dialog = $("body").data(dialog);
			}
			var close = dialog.data("close");
			var go = true;
			if (close && $.isFunction(close)) {
				var param = dialog.data("param");
				if (param && param != "") {
					param = DWZ.jsonEval(param);
					go = close(param);
				} else {
					go = close();
				}
				if (!go)
					return;
			}
            
			$(dialog).hide();
			$("div.shadow").hide();
			if ($(dialog).data("mask")) {
				$("#dialogBackground").hide();
			} else {
				if ($(dialog).data("id"))
					$.taskBar.closeDialog($(dialog).data("id"));
			}
			$("body").removeData($(dialog).data("id"));
			$(dialog).trigger(DWZ.eventType.pageClear).remove();
			var closeCallback = _op.closeCallback;			
			if($.isFunction(closeCallback)) {
				_op.closeCallback();
			}
			if(typeof closeCallback == "string") {
				eval(closeCallback+"()");
			}
			
			
		},
		closeCurrent : function() {
			this.close($.pdialog._current);
		},
		checkTimeout : function() {
			var $conetnt = $(".dialogContent", $.pdialog._current);
			var json = DWZ.jsonEval($conetnt.html());
			if (json && json.statusCode == DWZ.statusCode.timeout)
				this.closeCurrent();
		},
		maxsize : function(dialog) {
			$(dialog).data("original", {
						top : $(dialog).css("top"),
						left : $(dialog).css("left"),
						width : $(dialog).css("width"),
						height : $(dialog).css("height")
					});
			$("a.maximize", dialog).hide();
			$("a.restore", dialog).show();
			var iContentW = $(window).width();
			var iContentH = $(window).height() - 34;
			$(dialog).css({
						top : "0px",
						left : "0px",
						width : iContentW + "px",
						height : iContentH + "px"
					});
			$.pdialog._resizeContent(dialog, iContentW, iContentH);
		},
		restore : function(dialog) {
			var original = $(dialog).data("original");
			var dwidth = parseInt(original.width);
			var dheight = parseInt(original.height);
			$(dialog).css({
						top : original.top,
						left : original.left,
						width : dwidth,
						height : dheight
					});
			$.pdialog._resizeContent(dialog, dwidth, dheight);
			$("a.maximize", dialog).show();
			$("a.restore", dialog).hide();
			$.pdialog.attachShadow(dialog);
		},
		minimize : function(dialog) {
			$(dialog).hide();
			$("div.shadow").hide();
			var task = $.taskBar.getTask($(dialog).data("id"));
			$(".resizable").css({
						top : $(dialog).css("top"),
						left : $(dialog).css("left"),
						height : $(dialog).css("height"),
						width : $(dialog).css("width")
					}).show().animate({
						top : $(window).height() - 60,
						left : task.position().left,
						width : task.outerWidth(),
						height : task.outerHeight()
					}, 250, function() {
						$(this).hide();
						$.taskBar.inactive($(dialog).data("id"));
					});
		},
		_resizeContent : function(dialog, width, height) {
			var content = $(".dialogContent", dialog);
			content.css({
						width : (width - 12) + "px",
						height : height
								- $(".dialogHeader", dialog).outerHeight()
								- $(".dialogFooter", dialog).outerHeight() - 6
					});
			content.find("[layoutH]").layoutH(content);
			$(".pageContent", dialog).css("width", (width - 14) + "px");

			$(window).trigger(DWZ.eventType.resizeGrid);
		},
		initUi : function(dialog) {
			var indirect = eval;
			dialog.multiTable();
			dialog.showSelectDatas();
			dialog.checkSelected();
			var $parent = dialog;
			var selectDatas = $parent.data("selectDatas");
			if ( !! !selectDatas) {
				selectDatas = [];
				$parent.data("selectDatas", selectDatas);
			}
			dialog.find(".checkboxCtrl").click(function(){
				var group = $(this).attr("group");
				var $ctr = $(this);
				dialog.find(":checkbox").filter("[name='" + group + "']").each(function() {
					if($(this).is(":checked")) {
						var obj = DWZ.jsonEval($(this).val());
						var isHas = false;
						$.each(selectDatas, function(i, value) {
							if (value.id == obj.id) {
								isHas = true;
							}
						})
						if (!isHas) {
							selectDatas.push(obj);
						}
					}else {
						var obj = DWZ.jsonEval($(this).val());
						var len = selectDatas.length-1;
						for(var i =0;i<selectDatas.length;i++) {
							var d = selectDatas[i];
							if (d.id == obj.id) {
								if (len == i + 1) {
									var tmp = selectDatas[len];
									selectDatas.splice(i, i + 1);
									selectDatas.push(tmp);
								} else {
									selectDatas.splice(i, i + 1);
								}
							}
						}		
					}
					
				});
				
			})
			dialog.find("[keyup]").each(function(){
				var click = $(this).attr("keyup");
				if(StringUtils.isNotEmpty(click)) {
					var cf = indirect(click);
					if(typeof cf == "function") {
						$(this).on("keyup",{"selectDatas":selectDatas},cf);
					}
				}
			});
		}
	};
})(jQuery);